package com.car.shopping.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.car.shopping.controller.form.GoodsTypeForm;
import com.car.shopping.entity.GoodsType;
import com.car.shopping.mapper.GoodsInfoMapper;
import com.car.shopping.mapper.GoodsTypeMapper;
import com.car.shopping.service.GoodsTypeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.car.shopping.service.param.ModifyGoodsTypeParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 董旭
 * @since 2024-08-28
 */
@Service
public class GoodsTypeServiceImpl extends ServiceImpl<GoodsTypeMapper, GoodsType> implements GoodsTypeService {

    @Autowired
    private GoodsTypeMapper goodsTypeMapper;
    @Override
    public List<GoodsType> findAllGoodsType() throws Exception {
        return this.list();
    }

    @Override
    public GoodsType addType(GoodsTypeForm form) {
        // 创建新的商品类别
        GoodsType newType = new GoodsType();
        newType.setTypeName(form.getTypeName());
        newType.setTypeSelf(form.getTypeSelf()); // 0 是叶子节点，1 不是叶子节点

        if (form.getParentId() != null) {
            // 获取父节点信息
            GoodsType parentType = goodsTypeMapper.selectById(form.getParentId());

            if (parentType == null) {
                throw new IllegalArgumentException("Parent type does not exist");
            }

            // 检查父节点是否是叶子节点
            if (parentType.getTypeSelf() == 0) {
                // 将父节点的 typeSelf 属性更新为非叶子节点（1 不是叶子节点）
                parentType.setTypeSelf(1);
                goodsTypeMapper.updateById(parentType);
            }

            // 设置新类别的父节点
            newType.setParentId(form.getParentId());
        } else {
            // 如果没有父节点，则设置为顶级节点
            newType.setParentId(null);
        }

        // 保存新商品类别
        goodsTypeMapper.insert(newType);
        return newType;
    }

    @Override
    public void delGoodsType(Integer goodsTypeId) throws Exception {
        // 检查该类别是否有子类别
        QueryWrapper<GoodsType> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", goodsTypeId);
        Long count = goodsTypeMapper.selectCount(queryWrapper);
        if (count > 0) {
            throw new Exception("该类别下有子类别，不能删除");
        }
        // 删除指定的商品类别
        goodsTypeMapper.deleteById(goodsTypeId);
    }

    @Override
    public void modifyGoodsType(ModifyGoodsTypeParam param) throws Exception {
        // 查找要修改的商品类别
        GoodsType goodsType = goodsTypeMapper.selectById(param.getGoodsTypeId());
        if (goodsType == null) {
            throw new Exception("商品类别不存在");
        }

        // 更新类别名称
        goodsType.setTypeName(param.getTypeName());

        // 保存修改后的商品类别
        goodsTypeMapper.updateById(goodsType);
    }
}
